\section*{Descrizione del problema}

L'obiettivo di questa esercitazione \`e implementare le strutture dati
dei lati nella gestione di una \emph{mesh}. \\
Il programma fornito 
gestisce \emph{mesh} bidimensionali costituite da elementi triangolari
e quadrangolari. Per ciascuna forma geometrica sono
fornite funzionalit\`a specifiche, implementate in classi separate. 
La classe \cpp{Mesh} si occupa di memorizzare, in un'opportuna struttura dati,
le informazioni relative alla griglia. 
Tali informazioni sono memorizzate in un file strutturato come segue
\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=File di esempio contenente la descrizione di
una semplice \emph{mesh}]{./es/2/mesh.msh}
\lstset{basicstyle=\sf}
Si noti che il file d'esempio \`e suddiviso in tre sezioni:
\begin{itemize}
\item la riga successiva all'intestazione \cpp{#DATA} contiene il numero di
nodi e di elementi della griglia;
\item a seguire, l'elenco delle coordinate dei nodi precedute
  dall'intestazione \cpp{#POINTS};
\item in ultimo vi \`e l'elenco degli elementi, caratterizzati dalla
  geometria ($0$ per gli elementi triangolari, $1$ per quelli
  quadrangolari) e dalla sequenza ordinata dei vertici.
\end{itemize}

Poich\`e la classe \cpp{Mesh} contiene elementi di tipo
diverso, sono implementate due classi distinte
\cpp{Triangle} e \cpp{Quadrangle}, che discendono dalla medesima classe
base \cpp{Shape}. Gli elementi della griglia sono memorizzati
utilizzando una lista di puntatori a \cpp{Shape} ed i costrutti per
l'allocazione dinamica. La classe \cpp{Mesh} ha un
costruttore che riceve come argomento il nome di un file di dati di
tipo \cpp{.msh} e costruisce a partire da esso le strutture implementate.

\section*{Es. 1}

Si chiede di implementare i seguenti miglioramenti al codice
\begin{enumerate}
	\item si utilizzi una opportuna struttura dati per contenere i lati della mesh. Inserire
	nella classe \cpp{Mesh} un metodo, di nome \cpp{buildEdges}, che permette di riempire
	tale struttura dati;
	\item si modifichi l'operatore di reindirizzamento ad output della classe \cpp{Mesh}, 
	in modo da riportare a schermo la lista dei lati;
	\item si aggiunga alla classe \cpp{Edge} la possibilit\`a di contenere l'identificativo
	dell'elemento di destra e di sinistra. Si gestisca opportunamente il caso dei lati di bordo.
	\item si modifichi l'operatore di reindirizzamento ad output della classe \cpp{Mesh}, 
	in modo da riportare a schermo anche l'identificativo dell'elemento di destra e di sinistra
	di ciascun lato;
	\item si utilizzi una struttura analoga a quella implementata nel punto 1 per gestire i lati 
	di bordo, senza fare differenza sulla condizione al bordo ad essi associati.
\end{enumerate}

\section*{Es. 2}

Si implementi la possibilit\`a di interrogare la mesh. In particolare si vuole implementare un 
metodo di \cpp{Mesh} che, data una stringa contenente il tipo di condizione di bordo, ritorna
tutti i punti associati. Per risolvere questo punto si utilizzino gli operatori della standard
library.


%Come esercizio aggiuntivo, si scriva una funzione per generare i lati interni e di
%bordo della griglia, memorizzando per ciascuno gli elementi al cui
%bordo appartiene.
%Poich\`e la classe \cpp{Mesh} deve contenere elementi di tipo
%diverso, saranno implementate due classi distinte
%\cpp{Triangle} e \cpp{Quadrangle}, che discendono dalla medesima classe
%base \cpp{Shape}. Gli elementi della griglia saranno quindi memorizzati
%utilizzando una lista di puntatori a \cpp{Shape} ed i costrutti per
%l'allocazione dinamica. La classe \cpp{Mesh} ha un
%costruttore che riceve come argomento il nome di un file di dati di
%tipo \cpp{.msh} e costruisce a partire da esso le strutture richieste.
%
%L'obiettivo di questa esercitazione \`e implementare le strutture dati
%di base per la gestione di una \emph{mesh}. Si supponga di voler
%gestire \emph{mesh} bidimensionali costituite da elementi triangolari
%e quadrangolari. Per ciascuna forma geometrica si vogliono
%fornire funzionalit\`a specifiche, ed \`e, pertanto, prevista 
%un'implementazione con classi separate. Inoltre una classe \cpp{Mesh}
%si occuper\`a di memorizzare in un'opportuna struttura dati
%le informazioni relative alla griglia, che sono memorizzate in un file
%strutturato cos\`i strutturato:
%\lstset{basicstyle=\scriptsize\sf}
%\lstinputlisting[caption=File di esempio contenente la descrizione di
%una semplice \emph{mesh}]{./es/1/mesh.msh}
%\lstset{basicstyle=\sf}
%Si noti che il file d'esempio \`e suddiviso in tre sezioni:
%\begin{itemize}
%\item la riga successiva all'intestazione \cpp{#DATA} contiene il numero di
%nodi e di elementi della griglia;
%\item a seguire, l'elenco delle coordinate dei nodi precedute
%  dall'intestazione \cpp{#POINTS};
%\item in ultimo vi \`e l'elenco degli elementi, caratterizzati dalla
%  geometria ($0$ per gli elementi triangolari, $1$ per quelli
%  quadrangolari) e dalla sequenza ordinata dei vertici.
%\end{itemize}
%
%Poich\`e la classe \cpp{Mesh} deve contenere elementi di tipo
%diverso, saranno implementate due classi distinte
%\cpp{Triangle} e \cpp{Quadrangle}, che discendono dalla medesima classe
%base \cpp{Shape}. Gli elementi della griglia saranno quindi memorizzati
%utilizzando una lista di puntatori a \cpp{Shape} ed i costrutti per
%l'allocazione dinamica. La classe \cpp{Mesh} ha un
%costruttore che riceve come argomento il nome di un file di dati di
%tipo \cpp{.msh} e costruisce a partire da esso le strutture richieste.
%
%\section*{Esercizi con valutazione}
%
%% Completare la libreria proposta con la costruzione della classe \cpp{Edge}. Inoltre
%Svolgere almeno uno dei seguenti esercizi:
%\begin{itemize}
%\item si consideri il caso in cui
%il file di descrizione della mesh contenga anche l'indicazione del
%tipo di condizione al bordo associata a ciascun nodo.
%\lstset{basicstyle=\scriptsize\sf}
%\lstinputlisting[caption=Una semplice \emph{mesh}: sono indicate le
%condizioni al bordo associate ai nodi]{./es/3/mesh.msh}
%\lstset{basicstyle=\sf}
%
%Si utilizzi una opportuna struttura dati per associare
%l'identificativo di ciascun nodo con la stringa che definisce la condizione
%al bordo: si modifichi l'operatore di reindirizzamento ad output della
%classe \cpp{Mesh} per riportare a schermo la condizione al bordo
%associata a ciascun nodo.
%
%Si implementino inoltre le strutture dati e i metodi necessari per
%restituire a schermo una lista di nodi associati ad una certa stringa
%(o un messaggio di avviso se la stringa non \`e associata ad alcun
%nodo).
%
%Per questo esercizio si sfruttino gli algoritmi ed i contenitori STL.
%
%\item Si scriva un metodo della classe \cpp{mesh} che generari tutti i lati della griglia.
%(Suggerimento: per generare i lati, utilizzare il contenitore \cpp{set} o eventualmente \cpp{map} 
% della STL, insieme ad una relazione d'ordine. Memorizzare i lati trovati in un vettore.) 
%\end{itemize}

%Come esercizio aggiuntivo, si scriva una funzione per generare i lati interni e di
%bordo della griglia, memorizzando per ciascuno gli elementi al cui
%bordo appartiene.
